import static org.junit.Assert.*;

import navalgo3.Modelo.Destructor;
import navalgo3.Modelo.Disparo;
import navalgo3.Modelo.Lancha;
import navalgo3.Modelo.Mina;
import navalgo3.Modelo.MinaDobleConRetardo;
import navalgo3.Modelo.MinaPorContacto;
import navalgo3.Modelo.MinaPuntualConRetardo;
import navalgo3.Modelo.MinaTripleConRetardo;
import navalgo3.Modelo.Nave;
import navalgo3.Modelo.Noroeste;
import navalgo3.Modelo.Norte;
import navalgo3.Modelo.Posicion;
import navalgo3.Modelo.Sur;
import navalgo3.Modelo.Tablero;

import org.junit.Test;


import java.util.ArrayList;

import junit.framework.TestCase;

public class TableroTests extends TestCase {

	public void testSeColocanNaves(){
		Tablero miTablero = new Tablero();
		ArrayList <Posicion> posicionNave = new ArrayList <Posicion>();
		posicionNave.add(new Posicion(2,1));
		posicionNave.add(new Posicion(2,2));
		miTablero.colocarNave(new Lancha(posicionNave, new Sur()));
		posicionNave.clear();
		posicionNave.add(new Posicion(1,2));
		posicionNave.add(new Posicion(1,3));
		posicionNave.add(new Posicion(1,4));
		miTablero.colocarNave(new Destructor(posicionNave, new Noroeste()));
		ArrayList<Nave> navesEnJuego = miTablero.getNaves();
		assertTrue (navesEnJuego.get(0).tieneParteEn(new Posicion(2,1)));
		assertTrue (navesEnJuego.get(0).tieneParteEn(new Posicion(2,2)));
		assertTrue (navesEnJuego.get(0).getClass()== new Lancha(posicionNave,new Norte()).getClass());
		assertTrue (navesEnJuego.get(1).tieneParteEn(new Posicion(1,2)));
		assertTrue (navesEnJuego.get(1).tieneParteEn(new Posicion(1,3)));
		assertTrue (navesEnJuego.get(1).tieneParteEn(new Posicion(1,4)));
		assertTrue (navesEnJuego.get(1).getClass()== new Destructor(posicionNave,new Norte()).getClass());
	}
	
	public void testSeColocanMinas (){
		Tablero miTablero = new Tablero ();
		miTablero.colocarMina(new MinaPorContacto(new Posicion(3,3)));
		miTablero.colocarMina(new MinaDobleConRetardo(new Posicion(8,7)));
		miTablero.colocarMina(new MinaTripleConRetardo(new Posicion (1,1)));
		miTablero.colocarMina(new MinaPuntualConRetardo(new Posicion(5,8)));
		assertTrue (miTablero.tieneMinaEn(new Posicion(3,3)));
		assertTrue (miTablero.tieneMinaEn(new Posicion(8,7)));
		assertTrue (miTablero.tieneMinaEn(new Posicion(1,1)));
		assertTrue (miTablero.tieneMinaEn(new Posicion(5,8)));
	}
	
	@Test
	public void testSeColocaMinaDobleYExplotaAlosTresTurnos(){
		Tablero tableroActual = new Tablero();
		MinaDobleConRetardo unaMina = new MinaDobleConRetardo(new Posicion(3,3));
		tableroActual.colocarMina(unaMina);
		tableroActual.disminuirTiempoAMinas();
		tableroActual.disminuirTiempoAMinas();
		tableroActual.disminuirTiempoAMinas();
		assertTrue(unaMina.exploto());
	}
	
	@Test
	public void testSeColocaMinaTripleYExplotaAlosTresTurnos(){
		Tablero tableroActual = new Tablero();
		MinaTripleConRetardo unaMina = new MinaTripleConRetardo(new Posicion(3,3));
		tableroActual.colocarMina(unaMina);
		tableroActual.disminuirTiempoAMinas();
		assertFalse(unaMina.exploto());
		tableroActual.disminuirTiempoAMinas();
		assertFalse(unaMina.exploto());
		tableroActual.disminuirTiempoAMinas();
		assertTrue(unaMina.exploto());
	}
	
	@Test
	public void testSeColocanDosMinasYExplotanAlosTresTurnos(){
		Tablero tableroActual = new Tablero();
		MinaTripleConRetardo unaMinaTriple = new MinaTripleConRetardo(new Posicion(4,3));
		MinaDobleConRetardo unaMinaDoble = new MinaDobleConRetardo(new Posicion(3,3));
		tableroActual.colocarMina(unaMinaDoble);
		tableroActual.colocarMina(unaMinaTriple);
		tableroActual.disminuirTiempoAMinas();
		assertFalse(unaMinaDoble.exploto());
		assertFalse(unaMinaTriple.exploto());
		tableroActual.disminuirTiempoAMinas();
		assertFalse(unaMinaDoble.exploto());
		assertFalse(unaMinaTriple.exploto());
		tableroActual.disminuirTiempoAMinas();
		assertTrue(unaMinaDoble.exploto());
		assertTrue(unaMinaTriple.exploto());
	}
	
	public void testSeMuevenNaves(){
		Tablero miTablero = new Tablero();
		ArrayList <Posicion> posicionNave = new ArrayList <Posicion>();
		posicionNave.add(new Posicion(2,1));
		posicionNave.add(new Posicion(2,2));
		miTablero.colocarNave(new Lancha(posicionNave, new Sur()));
		posicionNave.clear();
		posicionNave.add(new Posicion(5,5));
		posicionNave.add(new Posicion(5,6));
		posicionNave.add(new Posicion(5,7));
		miTablero.colocarNave(new Destructor(posicionNave, new Noroeste()));
		miTablero.moverNaves();
		ArrayList<Nave> navesEnJuego = miTablero.getNaves();
		assertTrue (navesEnJuego.get(0).tieneParteEn(new Posicion(2,2)));
		assertTrue (navesEnJuego.get(0).tieneParteEn(new Posicion(2,3)));
		assertTrue (navesEnJuego.get(0).getClass()== new Lancha(posicionNave,new Norte()).getClass());
		assertTrue (navesEnJuego.get(1).tieneParteEn(new Posicion(4,4)));
		assertTrue (navesEnJuego.get(1).tieneParteEn(new Posicion(4,5)));
		assertTrue (navesEnJuego.get(1).tieneParteEn(new Posicion(4,6)));
		assertTrue (navesEnJuego.get(1).getClass()== new Destructor(posicionNave,new Norte()).getClass());
	}

	public void testSeRemuevenMinasPorTiempoExplotadas(){
		Tablero miTablero = new Tablero ();
		miTablero.colocarMina(new MinaDobleConRetardo(new Posicion(8,7)));
		miTablero.colocarMina(new MinaTripleConRetardo(new Posicion (1,1)));
		miTablero.colocarMina(new MinaPuntualConRetardo(new Posicion(5,8)));
		miTablero.disminuirTiempoAMinas();
		miTablero.disminuirTiempoAMinas();
		miTablero.disminuirTiempoAMinas();
		miTablero.removerMinasExplotadas();
		assertFalse (miTablero.tieneMinaEn(new Posicion (8,7)));
		assertFalse (miTablero.tieneMinaEn(new Posicion (1,1)));
		assertFalse (miTablero.tieneMinaEn(new Posicion (5,8)));
	}

	public void testSeRemueveMinaPorContactoExplotada(){
		Tablero miTablero = new Tablero ();
		Mina unaMinaPorContacto = new MinaPorContacto (new Posicion(8,7));
		unaMinaPorContacto.explotar();
		miTablero.colocarMina(unaMinaPorContacto);
		assertTrue (miTablero.tieneMinaEn(new Posicion(8,7)));
		miTablero.removerMinasExplotadas();
		assertFalse (miTablero.tieneMinaEn(new Posicion (8,7)));
		
	}

	public void testSeRemuevenDisparos(){
		Tablero miTablero = new Tablero ();
		miTablero.colocarDisparo(new Disparo (new Posicion (3,5)));
		assertTrue (miTablero.tieneDisparoEn(new Posicion(3,5)));
		miTablero.removerDisparos();
		assertFalse (miTablero.tieneDisparoEn(new Posicion (3,5)));
	}
}

